package upc.dew.inscripcionalumnos.dao.impl;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import upc.dew.inscripcionalumnos.dao.PostulanteDAO;
import upc.dew.inscripcionalumnos.exception.ServiceException;
import upc.dew.inscripcionalumnos.model.Documento;
import upc.dew.inscripcionalumnos.model.Postulante;
import upc.dew.inscripcionalumnos.model.Usuario;

public class PostulanteDAOImpl extends HibernateDaoSupport implements PostulanteDAO
{
    public PostulanteDAOImpl(SessionFactory sessionFactory)
    {
        setSessionFactory(sessionFactory);
    }

    public Postulante registrarPostulante(Postulante postulante) throws ServiceException
    {
        Session session = getSessionFactory().getCurrentSession();
        Transaction tx = session.getTransaction();
        tx.begin();
        session.saveOrUpdate(postulante);
        tx.commit();

        return postulante;
    }

    public List<Postulante> obtenerPostulantes() throws ServiceException
    {
        return getHibernateTemplate().loadAll(Postulante.class);
    }

    public Postulante obtenerPostulante(Integer codigoPostulante) throws ServiceException
    {
        return (Postulante) getHibernateTemplate().get(Postulante.class, codigoPostulante);
    }

    public Documento obtenerDocumento(Integer codigoPostulante) throws ServiceException
    {
        //        return (Documento) getHibernateTemplate().get(Documento.class, codigoPostulante);
        DetachedCriteria criteria = DetachedCriteria.forClass(Documento.class);
        criteria.add(Restrictions.eq("codigoPostulante", codigoPostulante));
        return (Documento) (getHibernateTemplate().findByCriteria(criteria)).get(0);


    }

    public List<Postulante> obtenerPostulantes(Integer fase, String estado) throws ServiceException
    {
        DetachedCriteria criteria = DetachedCriteria.forClass(Postulante.class);
        criteria.add(Restrictions.le("fase", fase));
        criteria.add(Restrictions.eq("estado", estado));
        return getHibernateTemplate().findByCriteria(criteria);
    }

    public Usuario registrarUsuario(Postulante postulante) throws ServiceException
    {
        Usuario usuario = new Usuario();
        usuario.setUsername(postulante.getUsername());
        usuario.setPassword(postulante.getPassword());
        usuario.setRol(postulante.getRol());

        Session session = getSessionFactory().getCurrentSession();
        Transaction tx = session.getTransaction();
        tx.begin();
        session.save(usuario);
        tx.commit();

        return usuario;
    }

    public Postulante obtenerPostulantePorCodigoUsuario(Integer codigoUsuario) throws ServiceException
    {
        Session session = getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Query query = session.getNamedQuery("obtenerpostulante");
        query.setInteger("usuario", codigoUsuario);
        Postulante postulante = (Postulante) query.uniqueResult();
        session.close();

        return postulante;
    }

    public void registrarDocumento(Documento documento) throws ServiceException
    {
        Session session = getSessionFactory().getCurrentSession();
        Transaction tx = session.getTransaction();
        tx.begin();
        session.save(documento);
        tx.commit();
    }

    public void eliminarDocumentos(Integer codigoPostulante) throws ServiceException
    {
        Session session = getSessionFactory().getCurrentSession();
        Transaction tx = session.getTransaction();
        session.beginTransaction();
        Query query = session.getNamedQuery("eliminarDocumentos");
        query.setInteger("codigoPostulante", codigoPostulante);
        int rowCount = query.executeUpdate();
        tx.commit();

    }


}